home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
util
/
pack
/
xpk_Source.lha
/
xpk_Source
/
xpkmaster
/
hook.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-09
|
2KB
|
81 lines
#ifndef XPKMASTER_HOOK_C
#define XPKMASTER_HOOK_C
/* Routinesheader
Name: hook.c
Main: xpkmaster
Versionstring: $VER: hook.c 1.5 (13.09.1998)
Author: SDI
Distribution: Freeware
Description: Hook handling functions
1.0 05.10.96 : first real version
1.1 27.12.96 : removed V37 defines
1.2 20.12.97 : nearly rewritten
1.3 09.01.98 : added XPK_ALLINONE
1.4 26.08.98 : returns XPKERR_BADPARAMS, when no hook exists
1.5 13.09.98 : added seek support
*/
#include <exec/types.h>
#include "xpkmaster.h"
#ifdef DEBUG
static STRPTR action_names[8] =
{"<zero>", "XIO_READ", "XIO_WRITE", "XIO_FREE", "XIO_ABORT", "XIO_GETBUF",
"XIO_SEEK", "XIO_TOTSIZE" };
#endif
static APTR callhook(struct XpkBuffer *xbuf, ULONG action, APTR buf,
LONG size, struct XpkMasterMsg *msg, struct Hook *hook)
{
LONG res;
msg->xmm_Type = action;
msg->xmm_Ptr = (STRPTR) buf;
msg->xmm_Size = size;
if(!hook)
{
xbuf->xb_Result = XPKERR_BADPARAMS;
return 0;
}
if((res = (*(regfunc) hook->h_Entry) (hook, msg, 0 A4SUPP2)))
{
xbuf->xb_Result = res;
#ifdef DEBUG
DebugError("hook%s: %s <%ld> (%ld)", msg == &xbuf->xb_RMsg ? "read" :
"write", action_names[(action&7)], action, xbuf->xb_Result);
#endif
}
if(xbuf->xb_Result)
return 0;
else if(msg->xmm_Ptr)
return (APTR) msg->xmm_Ptr;
else
return (APTR) -1; /* SEEK may return 0 on success! */
}
/*************************** read from input hook ************************/
XPK_ALLINONE APTR hookread(struct XpkBuffer *xbuf, ULONG action, APTR buf,
LONG size)
{
if(action == XIO_READ || action == XIO_SEEK)
xbuf->xb_InBufferPos += size;
return callhook(xbuf, action, buf, size, &xbuf->xb_RMsg, xbuf->xb_RHook);
}
/*************************** write to output hook ************************/
XPK_ALLINONE APTR hookwrite(struct XpkBuffer *xbuf, ULONG action, APTR buf,
LONG size)
{
return callhook(xbuf, action, buf, size, &xbuf->xb_WMsg, xbuf->xb_WHook);
}
#endif /* XPKMASTER_HOOK_C */